package edu.gdpu.bytecode;

/**
 * @author mazebin
 * @date 2021年 07月09日 17:15:00
 * finally 对返回值的影响
 * 其结果是10.就算你最后修改了i变量的值。通过C语言指针的理解，如果最后返回时读取i的值再返回，则结果应该是20.因为我们修改了指针所指向的区域的指为20
 * .但是结果还是10，是因为JVM执行时是将要返回的指放入一个新的局部变量里。最后再读取这个局部变量的值返回。因此我们肯定是无法在finally里通过指针修改返回值。
 */
public class ByteCodeTest9 {
    public static void main(String[] args) {
        int result =test();
        System.out.println(result);//没有异常发生，返回10，发生异常，返回20
    }

    public static int test() {
        int i=10;
        try {
         //   i =10/0;
            return  i;
        }catch ( Exception e ){
            i=20;
            return i;
        }
        finally {
           i=30;
         //  return i;
        }
    }
    /**
     * 字节码
     Code:
     stack=2, locals=4, args_size=0
     0: bipush        10 //将10压入栈
     2: istore_0         //将10存入局部变量表索引为0的变量 i
     8: iload_0         //从局部变量0装载到栈：10
     9: istore_1        //将10存入局部变量表索引为1的变量
     10: bipush        30  //将30压入栈
     12: istore_0    //将30存入局部变量表索引为0的变量
     13: iload_1    //从局部变量1装载到栈：10
     14: ireturn   //返回栈顶的10
     15: astore_1
     16: bipush        20
     18: istore_0
     19: iload_0
     20: istore_2
     21: bipush        30
     23: istore_0
     24: iload_2
     25: ireturn
     26: astore_3     //存入exception
     27: bipush        30
     29: istore_0
     30: aload_3
     31: athrow
     Exception table:
     from    to  target type
     3    10    15   Class java/lang/Exception
     3    10    26   any
     15    21    26   any

     */
}
